package com.ihr360.job.core.listener;

import com.ihr360.job.core.ItemWriteListener;
import org.springframework.core.Ordered;

import java.util.Iterator;
import java.util.List;

public class CompositeItemWriteListener<S> implements ItemWriteListener<S> {

    private OrderedComposite<ItemWriteListener<? super S>> listeners = new OrderedComposite<ItemWriteListener<? super S>>();

    /**
     * Public setter for the listeners.
     *
     * @param itemWriteListeners
     */
    public void setListeners(List<? extends ItemWriteListener<? super S>> itemWriteListeners) {
        this.listeners.setItems(itemWriteListeners);
    }

    /**
     * Register additional listener.
     *
     * @param itemWriteListener
     */
    public void register(ItemWriteListener<? super S> itemWriteListener) {
        listeners.add(itemWriteListener);
    }

    /**
     * Call the registered listeners in reverse order, respecting and
     * prioritising those that implement {@link Ordered}.
     * @see ItemWriteListener#afterWrite(java.util.List)
     */
    @Override
    public void afterWrite(List<? extends S> items) {
        for (Iterator<ItemWriteListener<? super S>> iterator = listeners.reverse(); iterator.hasNext();) {
            ItemWriteListener<? super S> listener = iterator.next();
            listener.afterWrite(items);
        }
    }

    /**
     * Call the registered listeners in order, respecting and prioritising those
     * that implement {@link Ordered}.
     * @see ItemWriteListener#beforeWrite(List)
     */
    @Override
    public void beforeWrite(List<? extends S> items) {
        for (Iterator<ItemWriteListener<? super S>> iterator = listeners.iterator(); iterator.hasNext();) {
            ItemWriteListener<? super S> listener = iterator.next();
            listener.beforeWrite(items);
        }
    }

    /**
     * Call the registered listeners in reverse order, respecting and
     * prioritising those that implement {@link Ordered}.
     * @see ItemWriteListener#onWriteError(Exception, List)
     */
    @Override
    public void onWriteError(Exception ex, List<? extends S> items) {
        for (Iterator<ItemWriteListener<? super S>> iterator = listeners.reverse(); iterator.hasNext();) {
            ItemWriteListener<? super S> listener = iterator.next();
            listener.onWriteError(ex, items);
        }
    }
}
